/*
 * CEV: sistema open-source para voteções institucionais
 * Copyright (C) 2009, 2010, 2011 Skynet Coders @ Universidade Estadual de Feira de Santana
 *
 * Este arquivo é parte do programa CEV.
 *
 * CEV é um software livre; você pode redistribui-lo e/ou modifica-lo
 * dentro dos termos da Licença Pública Geral GNU (GNU GPL) como publicada
 * pela Fundação do Software Livre (FSF) na versão 3 da Licença.
 *
 * Este programa é distribuido na esperança que possa ser util, mas
 * SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer
 * MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU para
 * maiores detalhes.
 *
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU
 * junto com este programa, se não, escreva para a Fundação do Software
 * Livre(FSF) Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */
#include "usercontroller.h"
#include <exception>
#include <QDebug>

using namespace std;
/**
  Manage the users of CEV system.

  @class UserController
  @package controller
  @since 18/05/2011
  @version 1.0
  @author Skynet Coders represented by Fernando Alberto Correia dos S. Jr. e João Carlos Nunes Bittencourt
  */

UserController::UserController()
{
}

UserController::~UserController()
{
    qDebug("Controller Destructor.");
}

/**
  Inserts a new user into database

  @param QString name of the user
  @param QString registration number
  @param QString type of user defining his clearance level
  @param QString descriptin for the new user
  @param QString login
  @param QString password
  @return bool true if user was created successfuly and an exception otherwise
  @since 18/05/2011
  @version 1.0
  */
bool UserController::create(QString name, QString registration, QString type, QString description, QString login, QString password)
{
    UserModel newUser;

    newUser.name = name;
    newUser.setRegistration(registration);
    newUser.type = type;
    newUser.description = description;
    newUser.setLogin(login);
    newUser.setPassword(password);

    try
    {
        newUser.add();
        return true;
    }
    catch (int ex)
    {
        if(ex == 19)
        {
            qDebug("Erro inserindo o novo user. Os campos nome e login devem ser unicos");
            // mensagem de erro que deve ser exibida quando o campo for único;
        }
        return false;
    }
}

/**
  Sign up a user in the system.

  @param QString registration number
  @param QString user password
  @return bool true if user signed successfuly and false otherwise
  @since 01/06/2011
  @version 1.0
  */
bool UserController::singUp(QString registration, QString password)
{
    try
    {
        if(!this->user.load(registration))
        {
            throw 1;
        }
        if(this->user.getPassword() != password)
        {
            throw 2;
        }
//        user.closeDatabase();
        return true;
    }
    catch (int err)
    {
        switch(err)
        {
        case 1:
            qDebug("Invalid registration.");
        case 2:
            qDebug("Password don't match with registration number.");
        }
//        user.closeDatabase();
        return false;
    }
}

/**
  Authenticates a user when he is running the system and try's to do
  some action that needs admin attentions.

  @param QString password
  @return bool true if the assert this method and false otherwise
  @since 18/05/2011
  @version 1.0
  */
bool UserController::authenticate(QString password)
{
    try
    {
        if(this->user.getRegistration() == "")
        {
            throw 1;
        }
        if(this->user.getPassword() == password)
        {
            return true;
        }
        return false;
    }
    catch (int err)
    {
        if(err == 1)
            qDebug("Nenhum user logado no momento.");
        //throw err;
        return false;
    }
    return false;
}

/**
  Change user type.

  @param QString registration
  @param QString user type
  @return bool true if type has been changend and false otherwise.
  */
bool UserController::changeType(QString registration, QString type)
{
    UserModel user;
    try
    {
        if(!user.load(registration))
        {
            throw 1;
        }
        user.type = type;
        try
        {
            // update new data
            user.update();
            return true;
        }
        catch (bool err)
        {
            throw 2;
        }

    }
    catch (bool err)
    {
        switch(err)
        {
        case 1:
            qDebug("Invalid registration.");
        case 2:
            qDebug("Error while updating data.");
        }
        return false;
    }
}

/**
  Changes user's password.
  For security reasons, only SysOps can change passwords.

  @param QString registration
  @param QString autorization password
  @param QString new password
  @return bool true if password was changed and false otherwise
  @since 18/05/2011
  @version 1.0
  */
bool UserController::changePass(QString registration, QString newPass)
{
    // only SysOp users can change passwords
    UserModel user;
    try
    {
        // load the user based on his registration number
        if(!user.load(registration))
        {
            // failure
            throw 1;
        }
        // set new password
        user.setPassword(newPass);
        try
        {
            // update new data
            user.update();
            return true;
        }
        catch (bool err)
        {
            throw 2;
        }
    }
    catch(int err)
    {
        switch(err)
        {
        case 1:
            qDebug("Ivalid registration.");
        case 2:
            qDebug("There is something wrong while updating the password.");
        }
        return false;
    }
    return false;
}
